#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <libpq-fe.h>

#include "error.h"
#include "pgsql.h"

typedef struct tagInfo
{
    char user_name[100];
    char password[100];
    char password_salt[100];
}INFO_S;

static void
exit_nicely(PGconn *conn, PGresult *res)
{
    PQclear(res);
    PQfinish(conn);
    exit(1);
}

int
main(int argc, char **argv)
{
    // test
    //const char *conninfo = "hostaddr=127.0.0.1 user=postgres password=123456 dbname=postgres sslmode=disable";
    //PGconn *conn;
    //PGresult *res;
    //int nFields;
    //int i, j;
    int index, index2; 
    int lib_ver = PQlibVersion();

    printf("Version of libpq: %d\n", lib_ver);

    int ret, i = 0;
    INFO_S stInfo;
    DB_HANDLER_S stHandler;
    //const char *command = "INSERT INTO usertbl(name, age, birthday) VALUES('win', 23, '1992-07-23');";
    const char *command = "SELECT username,password, password_salt FROM users;";

    memset(&stInfo, 0, sizeof(stInfo));
    memset(&stHandler, 0, sizeof(stHandler));

    ret = DB_Connect(&stHandler);
    if (ERROR_SUCCESS != ret)
    {
        return ret;
    }

    ret = DB_Exec(&stHandler, command);
    if (ERROR_SUCCESS != ret)
    {
        DB_Close(&stHandler);
        return ret;
    }

    printf("affect rows:%ld, tuples:%ld, fields:%ld\r\n", stHandler.affect_rows, stHandler.tuples, stHandler.fields);

    for(int line=0; line<stHandler.tuples; line++){
        for(i=0; i<3; i++){
            snprintf(stInfo.user_name, sizeof(stInfo.user_name), "%s", DB_Fetch(&stHandler, line, i++));
            snprintf(stInfo.password, sizeof(stInfo.password), "%s", DB_Fetch(&stHandler, line, i++));
            snprintf(stInfo.password_salt, sizeof(stInfo.password_salt), "%s", DB_Fetch(&stHandler, line, i++));
            printf("%s, %s, %s\r\n", stInfo.user_name, stInfo.password, stInfo.password_salt);
        }
    }


    DB_Close(&stHandler);

    return ERROR_SUCCESS;

    //conn = PQconnectdb(conninfo);

    //if(PQstatus(conn) != CONNECTION_OK)
    //{
    //    fprintf(stderr, "Connection to database failed: %s\n", PQerrorMessage(conn));
    //    PQfinish(conn);
    //    exit(1);
    //}

    //res = PQexec(conn, "insert into users (id, username, password) values (4,'admin','admin')");
    //if(PQresultStatus(res) != PGRES_COMMAND_OK)
    //{
    //    fprintf(stderr, "INSERT failed: %s", PQerrorMessage(conn));
    //    exit_nicely(conn, res);
    //}
    //PQclear(res);

    // res = PQexec(conn, "BEGIN");
    // if(PQresultStatus(res) != PGRES_COMMAND_OK)
    // {
    //     fprintf(stderr, "BEGIN common failed: %s", PQerrorMessage(conn));
    //     exit_nicely(conn, res);
    // }
    // PQclear(res);
    //
    // res = PQexec(conn, "DECLARE mydata CURSOR FOR select * from users");
    // if(PQresultStatus(res) != PGRES_COMMAND_OK)
    // {
    //     fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
    //     exit_nicely(conn, res);
    // }
    // PQclear(res);
    //
    // res = PQexec(conn, "FETCH ALL in mydata");
    // if(PQresultStatus(res) != PGRES_COMMAND_OK)
    // {
    //     fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
    //     exit_nicely(conn, res);
    // }
    //
    // nFields = PQnfields(res);
    // for(i = 0; i<nFields; i++){
    //     printf("%-15s", PQfname(res, i));
    // }
    // printf("\n\n");
    //
    // for(i=0; i<PQntuples(res); i++){
    //     for(j=0; j<nFields; j++){
    //         printf("%-15s", PQgetvalue(res, i, j));
    //     }
    //     printf("\n");
    // }
    //
    // PQclear(res);
    //
    // res = PQexec(conn, "CLOSE mydata");
    // PQclear(res);
    //
    // res = PQexec(conn, "END");
    // PQclear(res);
    //
    // PQfinish(conn);

    //return 0;
}
